package cn.iocoder.yudao.module.bk.util;

import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.module.bk.controller.app.vo.IsbnApiVo;

/**
 * @author Administrator
 */
public class ISBNUtils {

    /**
     * 判断字符串是否是合法的 ISBN-10 或 ISBN-13
     *
     * @param isbn 待校验的字符串
     * @return 如果是 ISBN 返回 true，否则 false
     */
    public static boolean isISBN(String isbn) {
        if (isbn == null || isbn.isEmpty()) {
            return false;
        }

        // 去除所有非数字和X字符（仅保留 ISBN 有效字符）
        String cleaned = isbn.replaceAll("[^0-9X]", "").toUpperCase();

        if (cleaned.length() == 10) {
            return isISBN10(cleaned);
        } else if (cleaned.length() == 13) {
            return isISBN13(cleaned);
        } else {
            return false;
        }
    }

    /**
     * 校验 ISBN-10 格式
     */
    private static boolean isISBN10(String isbn) {
        int total = 0;
        for (int i = 0; i < 10; i++) {
            char c = isbn.charAt(i);
            if (i == 9 && c == 'X') {
                total += 10;
            } else if (Character.isDigit(c)) {
                total += (10 - i) * (c - '0');
            } else {
                return false;
            }
        }
        return (total % 11 == 0);
    }

    /**
     * 校验 ISBN-13 格式
     */
    private static boolean isISBN13(String isbn) {
        if (!isbn.matches("\\d{13}")) {
            return false;
        }

        int total = 0;
        for (int i = 0; i < 13; i++) {
            int digit = Character.getNumericValue(isbn.charAt(i));
            total += digit * (i % 2 == 0 ? 1 : 3);
        }

        return (total % 10 == 0);
    }


    /**
     * 通过 ISBN 获取书籍信息
     *
     * @param isbn
     * @return
     */
    public static IsbnApiVo getBookInfoByISBNApi(String isbn) {
        String apiKey = "9a17697a87d349e91b4469d0f84d8edc";
        String body = HttpUtil.get("https://api.tanshuapi.com/api/isbn_base/v1/index?key=" + apiKey
                + "&isbn=" + isbn);
        JSONObject entries = JSONUtil.parseObj(body);
        if (entries.getInt("code") != 1) {
            throw new ServiceException("未找到ISBN书籍");
        }
        return entries.get("data", IsbnApiVo.class);
    }
}
